if ( (epdx >> shift) >= memnodemapsize )
return 0;
do {
- if ( memnodemap[spdx >> shift] != NUMA_NO_NODE )
+ if ( memnodemap[spdx >> shift] != NUMA_NO_NODE &&
+ (!nodeids || memnodemap[spdx >> shift] != nodeids[i]) )
return -1;
if ( !nodeids )
* maximum possible shift.
*/
static int __init extract_lsb_from_nodes(const struct node *nodes,
- int numnodes)
+ int numnodes, const nodeid_t *nodeids)
{
int i, nodes_used = 0;
unsigned long spdx, epdx;
if ( spdx >= epdx )
continue;
bitfield |= spdx;
- nodes_used++;
+ if ( !i || !nodeids || nodeids[i - 1] != nodeids[i] )
+ nodes_used++;
if ( epdx > memtop )
memtop = epdx;
}
{
int shift;
- shift = extract_lsb_from_nodes(nodes, numnodes);
+ shift = extract_lsb_from_nodes(nodes, numnodes, nodeids);
if ( memnodemapsize <= ARRAY_SIZE(_memnodemap) )
memnodemap = _memnodemap;
else if ( allocate_cachealigned_memnodemap() )